<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        // 源数据
        let person = {
            name: '张三',
            age: 18
        }

        // 模拟Vue2中实现响应式
        // #region
        // let p = {}
        // Object.defineProperty(p, 'name', {
        //     get() { // 有人读取name时调用
        //         return person.name
        //     },
        //     set(value) { // 有人修改name时调用
        //         console.log('有人修改了name属性，我发现了，我要求更新界面！');
        //         person.name = value
        //     }
        // })
        // Object.defineProperty(p, 'age', {
        //     get() { // 有人读取name时调用
        //         return person.age
        //     },
        //     set(value) { // 有人修改name时调用
        //         console.log('有人修改了name属性，我发现了，我要求更新界面！');
        //         perso.age = value
        //     }
        // })
        // #endregion
        
        // 模拟Vue3中的响应式
        const p = new Proxy(person, {
            // 有人读取p的某个属性时调用
            get(target, propName) {
                console.log(`有人读取了p身上的${propName}属性`);
                return Reflect.get(target, propName)
            },
            // 有人修改或追加p的某个属性时调用
            set(target, propName, value) {
                console.log(`有人修改了p身上的${propName}属性, 我要去更新页面了`);
                Reflect.set(target, propName, value)
            },
            // 有人删除p的某个属性时调用
            deleteProperty(target, propName,) {
                console.log(`有人修删除p身上的${propName}属性, 我要去更新页面了`);
                return Reflect.deleteProperty(target, propName)
            }
        })

        // let obj = {a: 1, b: 2};
        // Reflect.defineProperty(obj, 'c', {
        //     get() {
        //         return 3
        //     }
        // })
        // Reflect.defineProperty(obj, 'c', {
        //     get() {
        //         return 4
        //     }
        // })
    </script>
</body>
</html>